package com.songqintuan.common.util;


import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
public class Validation {
	private static Logger logger = Logger.getLogger(Validation.class);
	 /**
	  * 正则验证方法
	  *
	  * @param regexstr
	  * @param str
	  * @return
	  */
	 public static boolean Match(String regexstr, String str) {
	  Pattern regex = Pattern.compile(regexstr,Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
	  Matcher matcher = regex.matcher(str);
	  return matcher.matches();
	 }

	 /**
	  * 邮箱验证
	  *
	  * @param mail
	  * @return
	  */
	 public static boolean MatchMail(String mail) {
	  String mailregex = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
	  return Match(mailregex, mail);
	 }

	 /**
	  * 手机验证
	  *
	  * @param mobile
	  * @return
	  */
	 public static boolean MatchMobile(String mobile) {
	  String mobileregex = "^(13[4,5,6,7,8,9]|15[0,8,9,1,7]|188|187)\\d{8}$";
	  return Match(mobileregex, mobile);
	 }

	 /**
	  * 电话验证
	  *
	  * @param Tel
	  * @return
	  */
	 public static boolean MatchTel(String Tel) {
	  String telregex = "(^[0-9]{3,4}-[0-9]{7,8}-[0-9]{3,4}$)|(^[0-9]{3,4}-[0-9]{7,8}$)|(^[0-9]{7,8}-[0-9]{3,4}$)|(^[0-9]{7,15}$)";
	  return Match(telregex, Tel);
	 }

	 public static boolean Webdomain(String webdomain) {
	  String webdomainregex = "http://([^/]+)/*";
	  return Match(webdomainregex, webdomain);
	 }

	 public static boolean ZipCode(String zipcode) {
	  String zipcoderegex = "^[0-9]{6}$";
	  return Match(zipcoderegex, zipcode);
	 }

	 public static boolean IdCardNo(String idcard) {
	  HashMap<Integer, String> area = new HashMap<Integer, String>();
	  area.put(11, "北京");
	  area.put(12, "天津");
	  area.put(13, "河北");
	  area.put(14, "山西");
	  area.put(15, "内蒙古");
	  area.put(21, "辽宁");
	  area.put(22, "吉林");
	  area.put(23, "黑龙江");
	  area.put(31, "上海");
	  area.put(32, "江苏");
	  area.put(33, "浙江");
	  area.put(34, "安徽");
	  area.put(35, "福建");
	  area.put(36, "江西");
	  area.put(37, "山东");
	  area.put(41, "河南");
	  area.put(42, "湖北");
	  area.put(43, "湖南");
	  area.put(44, "广东");
	  area.put(45, "广西");
	  area.put(46, "海南");
	  area.put(50, "重庆");
	  area.put(51, "四川");
	  area.put(52, "贵州");
	  area.put(53, "云南");
	  area.put(54, "西藏");
	  area.put(61, "陕西");
	  area.put(62, "甘肃");
	  area.put(63, "青海");
	  area.put(64, "宁夏");
	  area.put(65, "新疆");
	  area.put(71, "台湾");
	  area.put(81, "香港");
	  area.put(82, "澳门");
	  area.put(91, "国外");
	  if(StringUtils.isBlank(idcard)) return false;
	  logger.info("身份证所在地："+area.get(Integer.parseInt(idcard.substring(0, 2))));
	  if(area.get(Integer.parseInt(idcard.substring(0, 2)))==null) return false;
	  if(!(idcard.length()==15||idcard.length()==18)) return false;
	  if(idcard.length()==15){
	   //老身份证
	   int year = Integer.parseInt(idcard.substring(2,6))+1900;
	   String ereg;
	   if (year % 4 == 0||(year% 100 == 0 &&year % 4 == 0 )){
	    ereg="^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) [0-9]{3}$";//测试出生日期的合法性
	    }else{
	     ereg="^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2] [0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$";//测试出生日期的合法性
	    }
	    if(Match(ereg, idcard))
	     return true;
	    else
	     return false;
	   
	  }else if(idcard.length()==18){
	   //新省份证
	    //18位身份号码检测
	    //出生日期的合法性检查
	    //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
	    //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
	   int year = Integer.parseInt(idcard.substring(2,6))+1900;
	   String ereg;
	    if (year % 4 == 0 ||(year % 100 == 0 && year%4 == 0 )){
	     ereg="^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9])) [0-9]{3}[0-9Xx]$";//闰年出生日期的合法性正则表达式
	    }else{
	     ereg="^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2] [0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2] [0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$";//平年出生日期的合法性正则表达式
	    }
	    if(Match(ereg, idcard)){//测试出生日期的合法性
	    //计算校验位
	     int[] idcards = new int[18];
	     for (int i = 0; i < idcard.length(); i++) {
	     idcards[i]=Integer.parseInt(idcard.substring(i, i+1));
	    }
	     int S = (idcards[0] + idcards[10]) * 7
	     + (idcards[1] + idcards[11]) * 9
	     + (idcards[2] + idcards[12]) * 10
	     + (idcards[3] + idcards[13]) * 5
	     + (idcards[4] + idcards[14]) * 8
	     + (idcards[5] + idcards[15]) * 4
	     + (idcards[6] + idcards[16]) * 2
	     + idcards[7] * 1
	     + idcards[8] * 6
	     + idcards[9] * 3 ;
	     int Y = S % 11;
	     String M = "F";
	     String JYM = "10X98765432";
	     M = JYM.substring(Y,Y+1);//判断校验位
	     if(StringUtils.equalsIgnoreCase(M, String.valueOf(idcards[17])))
	       return true; //检测ID的校验位
	     else
	      return false;
	    }
	    else
	     return false;
	  }
	  return false;
	 }

}
